library(tidyverse)
library(janitor)

Attaching package: ‘janitor’

The following objects are masked from ‘package:stats’:

    chisq.test, fisher.test
library(here)
here() starts at /Users/richardmichaelclark/games_data_sales_project/games_data_sales_project
sales_clean_2019
here()
[1] "/Users/richardmichaelclark/games_data_sales_project/games_data_sales_project"
sales_clean_2019 %>% 
  ggplot(aes(x = name, y = total_shipped)) +
  geom_point()

ggsave("noise.png")
Saving 7.29 x 4.51 in image

here()
[1] "/Users/richardmichaelclark/games_data_sales_project/games_data_sales_project"
sales_2016 <- read_csv("raw_data/sales-2016-with-ratings.csv")
Parsed with column specification:
cols(
  Name = col_character(),
  Platform = col_character(),
  Year_of_Release = col_character(),
  Genre = col_character(),
  Publisher = col_character(),
  NA_Sales = col_double(),
  EU_Sales = col_double(),
  JP_Sales = col_double(),
  Other_Sales = col_double(),
  Global_Sales = col_double(),
  Critic_Score = col_double(),
  Critic_Count = col_double(),
  User_Score = col_character(),
  User_Count = col_double(),
  Developer = col_character(),
  Rating = col_character()
)
sales_2016
names(sales_2016)
 [1] "Name"            "Platform"        "Year_of_Release" "Genre"           "Publisher"      
 [6] "NA_Sales"        "EU_Sales"        "JP_Sales"        "Other_Sales"     "Global_Sales"   
[11] "Critic_Score"    "Critic_Count"    "User_Score"      "User_Count"      "Developer"      
[16] "Rating"         

I wanted to check all the variable names. They are in capitals so I want to lose the capitals so I will use the clean_names function from janitor package:

sales_clean_2016 <- clean_names(sales_2016)
glimpse(sales_clean_2016)
Rows: 16,719
Columns: 16
$ name            <chr> "Wii Sports", "Super Mario Bros.", "Mario Kart Wii", "Wii Sports Resort", …
$ platform        <chr> "Wii", "NES", "Wii", "Wii", "GB", "GB", "DS", "Wii", "Wii", "NES", "DS", "…
$ year_of_release <chr> "2006", "1985", "2008", "2009", "1996", "1989", "2006", "2006", "2009", "1…
$ genre           <chr> "Sports", "Platform", "Racing", "Sports", "Role-Playing", "Puzzle", "Platf…
$ publisher       <chr> "Nintendo", "Nintendo", "Nintendo", "Nintendo", "Nintendo", "Nintendo", "N…
$ na_sales        <dbl> 41.36, 29.08, 15.68, 15.61, 11.27, 23.20, 11.28, 13.96, 14.44, 26.93, 9.05…
$ eu_sales        <dbl> 28.96, 3.58, 12.76, 10.93, 8.89, 2.26, 9.14, 9.18, 6.94, 0.63, 10.95, 7.47…
$ jp_sales        <dbl> 3.77, 6.81, 3.79, 3.28, 10.22, 4.22, 6.50, 2.93, 4.70, 0.28, 1.93, 4.13, 7…
$ other_sales     <dbl> 8.45, 0.77, 3.29, 2.95, 1.00, 0.58, 2.88, 2.84, 2.24, 0.47, 2.74, 1.90, 0.…
$ global_sales    <dbl> 82.53, 40.24, 35.52, 32.77, 31.37, 30.26, 29.80, 28.92, 28.32, 28.31, 24.6…
$ critic_score    <dbl> 76, NA, 82, 80, NA, NA, 89, 58, 87, NA, NA, 91, NA, 80, 61, 80, 97, 95, NA…
$ critic_count    <dbl> 51, NA, 73, 73, NA, NA, 65, 41, 80, NA, NA, 64, NA, 63, 45, 33, 50, 80, NA…
$ user_score      <chr> "8", NA, "8.3", "8", NA, NA, "8.5", "6.6", "8.4", NA, NA, "8.6", NA, "7.7"…
$ user_count      <dbl> 322, NA, 709, 192, NA, NA, 431, 129, 594, NA, NA, 464, NA, 146, 106, 52, 3…
$ developer       <chr> "Nintendo", NA, "Nintendo", "Nintendo", NA, NA, "Nintendo", "Nintendo", "N…
$ rating          <chr> "E", NA, "E", "E", NA, NA, "E", "E", "E", NA, NA, "E", NA, "E", "E", "E", …

O want to check for missing variables and n/a so I do this through summary function.

summary(sales_clean_2016)
     name             platform         year_of_release       genre            publisher        
 Length:16719       Length:16719       Length:16719       Length:16719       Length:16719      
 Class :character   Class :character   Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character   Mode  :character  
                                                                                               
                                                                                               
                                                                                               
                                                                                               
    na_sales          eu_sales         jp_sales        other_sales        global_sales    
 Min.   : 0.0000   Min.   : 0.000   Min.   : 0.0000   Min.   : 0.00000   Min.   : 0.0100  
 1st Qu.: 0.0000   1st Qu.: 0.000   1st Qu.: 0.0000   1st Qu.: 0.00000   1st Qu.: 0.0600  
 Median : 0.0800   Median : 0.020   Median : 0.0000   Median : 0.01000   Median : 0.1700  
 Mean   : 0.2633   Mean   : 0.145   Mean   : 0.0776   Mean   : 0.04733   Mean   : 0.5335  
 3rd Qu.: 0.2400   3rd Qu.: 0.110   3rd Qu.: 0.0400   3rd Qu.: 0.03000   3rd Qu.: 0.4700  
 Max.   :41.3600   Max.   :28.960   Max.   :10.2200   Max.   :10.57000   Max.   :82.5300  
                                                                                          
  critic_score    critic_count     user_score          user_count       developer        
 Min.   :13.00   Min.   :  3.00   Length:16719       Min.   :    4.0   Length:16719      
 1st Qu.:60.00   1st Qu.: 12.00   Class :character   1st Qu.:   10.0   Class :character  
 Median :71.00   Median : 21.00   Mode  :character   Median :   24.0   Mode  :character  
 Mean   :68.97   Mean   : 26.36                      Mean   :  162.2                     
 3rd Qu.:79.00   3rd Qu.: 36.00                      3rd Qu.:   81.0                     
 Max.   :98.00   Max.   :113.00                      Max.   :10665.0                     
 NA's   :8582    NA's   :8582                        NA's   :9129                        
    rating         
 Length:16719      
 Class :character  
 Mode  :character  
                   
                   
                   
                   

Things I note from the summary:

year_of_release is character class which is odd. Is it a relevant variable to answer the questions? I think for plotting time series that it could be so I would want to change the year to an integer.

na_sales is North American sales eu_sales is European jp_sales is Japan other_sales is rest of world global_sales is the sum of all the others

sales_clean_2016 %>% 
  ggplot(aes(x = name, y = global_sales)) +
  geom_point()

So it would appear that there is one outlier that done much better than the rest. Let’s try and find out who that is:

sales_clean_2016 %>% 
  arrange(desc(global_sales))
boxplot(sales_clean_2016$global_sales)

sales_2019 <- read_csv("raw_data/sales-2019.csv")
Parsed with column specification:
cols(
  .default = col_double(),
  Name = col_character(),
  basename = col_character(),
  Genre = col_character(),
  ESRB_Rating = col_character(),
  Platform = col_character(),
  Publisher = col_character(),
  Developer = col_character(),
  VGChartz_Score = col_logical(),
  Last_Update = col_character(),
  url = col_character(),
  img_url = col_character()
)
See spec(...) for full column specifications.
sales_clean_2019 <- clean_names(sales_2019)
sales_clean_2019

sales_clean_2019 %>% 
  ggplot(aes(x = name, y = total_shipped)) +
  geom_point()

ggsave("sound_of_success")
Error: Unknown graphics device ''
sales_clean_2019 %>% 
  summary()
      rank           name             basename            genre           esrb_rating       
 Min.   :    1   Length:55792       Length:55792       Length:55792       Length:55792      
 1st Qu.:13949   Class :character   Class :character   Class :character   Class :character  
 Median :27896   Mode  :character   Mode  :character   Mode  :character   Mode  :character  
 Mean   :27896                                                                              
 3rd Qu.:41844                                                                              
 Max.   :55792                                                                              
                                                                                            
   platform          publisher          developer         vg_chartz_score  critic_score  
 Length:55792       Length:55792       Length:55792       Mode:logical    Min.   : 1.00  
 Class :character   Class :character   Class :character   NA's:55792      1st Qu.: 6.40  
 Mode  :character   Mode  :character   Mode  :character                   Median : 7.50  
                                                                          Mean   : 7.21  
                                                                          3rd Qu.: 8.30  
                                                                          Max.   :10.00  
                                                                          NA's   :49256  
   user_score    total_shipped    global_sales      na_sales       pal_sales        jp_sales    
 Min.   : 2.00   Min.   : 0.03   Min.   : 0.00   Min.   :0.00    Min.   :0.00    Min.   :0.00   
 1st Qu.: 7.80   1st Qu.: 0.20   1st Qu.: 0.03   1st Qu.:0.05    1st Qu.:0.01    1st Qu.:0.02   
 Median : 8.50   Median : 0.59   Median : 0.12   Median :0.12    Median :0.04    Median :0.05   
 Mean   : 8.25   Mean   : 1.89   Mean   : 0.37   Mean   :0.28    Mean   :0.16    Mean   :0.11   
 3rd Qu.: 9.10   3rd Qu.: 1.80   3rd Qu.: 0.36   3rd Qu.:0.29    3rd Qu.:0.14    3rd Qu.:0.12   
 Max.   :10.00   Max.   :82.86   Max.   :20.32   Max.   :9.76    Max.   :9.85    Max.   :2.69   
 NA's   :55457   NA's   :53965   NA's   :36377   NA's   :42828   NA's   :42603   NA's   :48749  
  other_sales         year      last_update            url                status  vgchartzscore  
 Min.   :0.00    Min.   :1970   Length:55792       Length:55792       Min.   :1   Min.   :2.60   
 1st Qu.:0.00    1st Qu.:2000   Class :character   Class :character   1st Qu.:1   1st Qu.:6.80   
 Median :0.01    Median :2008   Mode  :character   Mode  :character   Median :1   Median :7.80   
 Mean   :0.04    Mean   :2006                                         Mean   :1   Mean   :7.43   
 3rd Qu.:0.04    3rd Qu.:2011                                         3rd Qu.:1   3rd Qu.:8.50   
 Max.   :3.12    Max.   :2020                                         Max.   :1   Max.   :9.60   
 NA's   :40270   NA's   :979                                                      NA's   :54993  
   img_url         
 Length:55792      
 Class :character  
 Mode  :character  
                   
                   
                   
                   
sales_clean_2019
view(sales_clean_2016)
view(sales_clean_2019)
boxplot(sales_clean_2019$global_sales)

names(sales_clean_2016)
 [1] "name"            "platform"        "year_of_release" "genre"           "publisher"      
 [6] "na_sales"        "eu_sales"        "jp_sales"        "other_sales"     "global_sales"   
[11] "critic_score"    "critic_count"    "user_score"      "user_count"      "developer"      
[16] "rating"         
names(sales_clean_2019)
 [1] "rank"            "name"            "basename"        "genre"           "esrb_rating"    
 [6] "platform"        "publisher"       "developer"       "vg_chartz_score" "critic_score"   
[11] "user_score"      "total_shipped"   "global_sales"    "na_sales"        "pal_sales"      
[16] "jp_sales"        "other_sales"     "year"            "last_update"     "url"            
[21] "status"          "vgchartzscore"   "img_url"        
sales_clean_2016 %>% 
  select(critic_score) %>% 
  arrange(desc(critic_score))
sales_clean_2019 %>% 
  select(critic_score) %>% 
  arrange(desc(critic_score))
sales_clean_2016 %>% 
  distinct(rating)
sales_clean_2019 %>% 
  distinct(esrb_rating)
sales_clean_2019 %>% 
  distinct(vg_chartz_score)
sales_clean_2019 %>% 
  filter(total_shipped > 0) %>% 
  count(global_sales) 
sales_clean_2019 %>% 
  filter(total_shipped > 0) %>% 
  count(na_sales) 
sales_clean_2019 %>% 
  filter(total_shipped > 0) %>% 
  count(pal_sales) 
sales_clean_2019 %>% 
  filter(total_shipped > 0) %>% 
  count(jp_sales) 
sales_clean_2019 %>% 
  filter(total_shipped > 0) %>% 
  count(other_sales)
sales_clean_2019 %>% 
  filter(global_sales > 0) %>%
  select(global_sales, na_sales, pal_sales, jp_sales, other_sales) %>% 
  summary
  global_sales        na_sales      pal_sales        jp_sales      other_sales   
 Min.   : 0.0100   Min.   :0.00   Min.   :0.000   Min.   :0.000   Min.   :0.000  
 1st Qu.: 0.0500   1st Qu.:0.05   1st Qu.:0.020   1st Qu.:0.020   1st Qu.:0.000  
 Median : 0.1400   Median :0.12   Median :0.050   Median :0.050   Median :0.010  
 Mean   : 0.3935   Mean   :0.28   Mean   :0.169   Mean   :0.114   Mean   :0.048  
 3rd Qu.: 0.4000   3rd Qu.:0.29   3rd Qu.:0.160   3rd Qu.:0.130   3rd Qu.:0.040  
 Max.   :20.3200   Max.   :9.76   Max.   :9.850   Max.   :2.690   Max.   :3.120  
                   NA's   :5258   NA's   :5910    NA's   :11244   NA's   :3525   
?sum
global_sales_tot <- sales_clean_2019 %>% 
  filter(global_sales > 0) %>% 
  select(global_sales) %>% 
  sum()
global_sales_tot
[1] 7096.24
na_sales_tot <- sales_clean_2019 %>% 
  filter(na_sales > 0) %>% 
  select(na_sales) %>% 
  sum()
na_sales_tot
[1] 3572.12
pal_sales_tot <- sales_clean_2019 %>% 
  filter(pal_sales > 0) %>% 
  select(pal_sales) %>% 
  sum()
pal_sales_tot
[1] 2047.76
jp_sales_tot <- sales_clean_2019 %>% 
  filter(jp_sales > 0) %>% 
  select(jp_sales) %>% 
  sum()
jp_sales_tot
[1] 777.56
other_sales_tot <- sales_clean_2019 %>% 
  filter(other_sales > 0) %>% 
  select(other_sales) %>% 
  sum()
other_sales_tot
[1] 694.13
global_sales_tot - (jp_sales_tot + na_sales_tot + other_sales_tot + pal_sales_tot)
[1] 4.67
sales_clean_2019 %>% 
  filter(last_update > 0) %>% 
  distinct(last_update)
sales_clean_2019 %>% 
  distinct(status)
sales_clean_2019 %>% 
  filter(vgchartzscore > 0) %>% 
  select(critic_score, user_score, vgchartzscore)
sales_clean_2019 %>% 
  filter(global_sales == 0) %>% 
  select(na_sales, pal_sales, jp_sales, other_sales)
sales_clean_2019
sales_clean_2019 %>% 
  distinct(esrb_rating)
sales_clean_2019 <- sales_clean_2019 %>% 
  mutate("e", esrb_rating = "ka")
sales_miss <- sales_clean_2019 %>% 
  filter(na_sales == 0) %>% 
  mutate("missing_sales", (global_sales - na_sales - pal_sales - jp_sales - other_sales)) %>% 

sales_miss
Error in sales_miss(.) : could not find function "sales_miss"

Now I am going to confirm which variable heading in 2016 is what in 2019:

2016 vs 2019 rank only in 2019 Name is Name and basename in 2019 looks like a cleaned version of name Platform is platform Year of release is year ut year of release is a character and I can’t work out how to turn it into a numer so I think we should exclude this variable genre is genre publisher is publisher na-sales is na_sales jp_sales is jp_sales eu_sales is separate; pal_sales is Asia, Africa, Europe, South America and Oceania according to google but according to the data dictionary is=t is EU sales Therefore other_sales in 2016 doesn’t match other_sales in 2019 global_sales is global_sales critic_score numbers 84 to 100 in 2016 critic_score numbers 8.6 to 10 in 2019 (so I will divide that figure in 2016 by 10 to compare) critic_count and user_count appear to be the number of critics and users who have been asked to derive the average review score so I am going to pull them out of the data developer is developer I googled the games rating and this is reference to age appropriateness: https://en.wikipedia.org/wiki/Entertainment_Software_Rating_Board E = Everyone M = Mature 17+ T = Teen 13+ E10+ = everyone ten years old and older K-A = Kids to adults - later renamed everyone AO = adults only 18+ EC = early childhood RP = Rating pending

In 2019 this is callied esrb_rating and KA can also be changed to E

Also included in 2019 data is vg_chartz_score which has no variables so that can excluded from the cleaned dataset Total shipped which appears instead of global sales and has no other split

Unfortunately there are missing variables for all geographic areas but the margin of difference is 4.67m so I am going to create a mutate function to highlight which ones have a missing variable and see if they can be added together

Last_update is an interesting piece of information because it indicates an update since the last dataset and also that there is some longevity to the original release. I am inclined to keep this variable even though there are several with no figure. The reason for this is that I have a theory that the ones with updates are likely to be big sellers.

I will exclude the url column because it’s not relevant for this piece of analysis There is inly one status of ‘1’ so I will be removing that. I need to make the year into a number as integer or numeric (will check) It’s not clear why there wasn’t vgchartz variables on the 2016 dataset because it was launched some time before then. https://en.wikipedia.org/wiki/VGChartz

I will exclude the img irl variable.

I am going to make the year in 2016 data a number:

sales_clean_2016 <- sales_clean_2016 %>% 
  as.numeric("year_of_release")
Error in function_list[[k]](value) : 
  (list) object cannot be coerced to type 'double'

That doesn’t seem to work. It does now.

summary(sales_clean_2016)
     name             platform         year_of_release       genre            publisher        
 Length:16719       Length:16719       Length:16719       Length:16719       Length:16719      
 Class :character   Class :character   Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character   Mode  :character  
                                                                                               
                                                                                               
                                                                                               
                                                                                               
    na_sales          eu_sales         jp_sales        other_sales        global_sales    
 Min.   : 0.0000   Min.   : 0.000   Min.   : 0.0000   Min.   : 0.00000   Min.   : 0.0100  
 1st Qu.: 0.0000   1st Qu.: 0.000   1st Qu.: 0.0000   1st Qu.: 0.00000   1st Qu.: 0.0600  
 Median : 0.0800   Median : 0.020   Median : 0.0000   Median : 0.01000   Median : 0.1700  
 Mean   : 0.2633   Mean   : 0.145   Mean   : 0.0776   Mean   : 0.04733   Mean   : 0.5335  
 3rd Qu.: 0.2400   3rd Qu.: 0.110   3rd Qu.: 0.0400   3rd Qu.: 0.03000   3rd Qu.: 0.4700  
 Max.   :41.3600   Max.   :28.960   Max.   :10.2200   Max.   :10.57000   Max.   :82.5300  
                                                                                          
  critic_score    critic_count     user_score          user_count       developer        
 Min.   :13.00   Min.   :  3.00   Length:16719       Min.   :    4.0   Length:16719      
 1st Qu.:60.00   1st Qu.: 12.00   Class :character   1st Qu.:   10.0   Class :character  
 Median :71.00   Median : 21.00   Mode  :character   Median :   24.0   Mode  :character  
 Mean   :68.97   Mean   : 26.36                      Mean   :  162.2                     
 3rd Qu.:79.00   3rd Qu.: 36.00                      3rd Qu.:   81.0                     
 Max.   :98.00   Max.   :113.00                      Max.   :10665.0                     
 NA's   :8582    NA's   :8582                        NA's   :9129                        
    rating          as.numeric(year_of_release) as.numeric("year_of_release")
 Length:16719       Min.   :1980                Min.   : NA                  
 Class :character   1st Qu.:2003                1st Qu.: NA                  
 Mode  :character   Median :2007                Median : NA                  
                    Mean   :2006                Mean   :NaN                  
                    3rd Qu.:2010                3rd Qu.: NA                  
                    Max.   :2020                Max.   : NA                  
                    NA's   :269                 NA's   :16719                

Let’s make all variables lower case

sales_clean_2016 <- sales_clean_2016 %>% 
  mutate_all(.funs = tolower)
head(sales_clean_2016)
#sales_clean_2019 <- sales_clean_2019 %>% 
 # mutate_all(.funs = tolower)
#head(sales_clean_2019)

I want to fill in missing sales volumes I am going to exclude basename from 2019 results I am going to change critic_score in 2016 to critic_score_2016 and do the same for 2019 I am going to change pal_sales in 2019 to eu_sales_2019 and add the year to

summary(sales_clean_2019)
      rank           name             basename            genre           esrb_rating       
 Min.   :    1   Length:55792       Length:55792       Length:55792       Length:55792      
 1st Qu.:13949   Class :character   Class :character   Class :character   Class :character  
 Median :27896   Mode  :character   Mode  :character   Mode  :character   Mode  :character  
 Mean   :27896                                                                              
 3rd Qu.:41844                                                                              
 Max.   :55792                                                                              
                                                                                            
   platform          publisher          developer         vg_chartz_score  critic_score  
 Length:55792       Length:55792       Length:55792       Mode:logical    Min.   : 1.00  
 Class :character   Class :character   Class :character   NA's:55792      1st Qu.: 6.40  
 Mode  :character   Mode  :character   Mode  :character                   Median : 7.50  
                                                                          Mean   : 7.21  
                                                                          3rd Qu.: 8.30  
                                                                          Max.   :10.00  
                                                                          NA's   :49256  
   user_score    total_shipped    global_sales      na_sales       pal_sales        jp_sales    
 Min.   : 2.00   Min.   : 0.03   Min.   : 0.00   Min.   :0.00    Min.   :0.00    Min.   :0.00   
 1st Qu.: 7.80   1st Qu.: 0.20   1st Qu.: 0.03   1st Qu.:0.05    1st Qu.:0.01    1st Qu.:0.02   
 Median : 8.50   Median : 0.59   Median : 0.12   Median :0.12    Median :0.04    Median :0.05   
 Mean   : 8.25   Mean   : 1.89   Mean   : 0.37   Mean   :0.28    Mean   :0.16    Mean   :0.11   
 3rd Qu.: 9.10   3rd Qu.: 1.80   3rd Qu.: 0.36   3rd Qu.:0.29    3rd Qu.:0.14    3rd Qu.:0.12   
 Max.   :10.00   Max.   :82.86   Max.   :20.32   Max.   :9.76    Max.   :9.85    Max.   :2.69   
 NA's   :55457   NA's   :53965   NA's   :36377   NA's   :42828   NA's   :42603   NA's   :48749  
  other_sales         year      last_update            url                status  vgchartzscore  
 Min.   :0.00    Min.   :1970   Length:55792       Length:55792       Min.   :1   Min.   :2.60   
 1st Qu.:0.00    1st Qu.:2000   Class :character   Class :character   1st Qu.:1   1st Qu.:6.80   
 Median :0.01    Median :2008   Mode  :character   Mode  :character   Median :1   Median :7.80   
 Mean   :0.04    Mean   :2006                                         Mean   :1   Mean   :7.43   
 3rd Qu.:0.04    3rd Qu.:2011                                         3rd Qu.:1   3rd Qu.:8.50   
 Max.   :3.12    Max.   :2020                                         Max.   :1   Max.   :9.60   
 NA's   :40270   NA's   :979                                                      NA's   :54993  
   img_url         
 Length:55792      
 Class :character  
 Mode  :character  
                   
                   
                   
                   
sales_clean_2019_sec <- sales_clean_2019 %>% 
  select(-basename) %>% 
  select(-vg_chartz_score) %>% 
  select(-url) %>% 
  select(-status) %>% 
  select(-img_url)
  

summary(sales_clean_2019_sec)
      rank           name              genre           esrb_rating          platform        
 Min.   :    1   Length:55792       Length:55792       Length:55792       Length:55792      
 1st Qu.:13949   Class :character   Class :character   Class :character   Class :character  
 Median :27896   Mode  :character   Mode  :character   Mode  :character   Mode  :character  
 Mean   :27896                                                                              
 3rd Qu.:41844                                                                              
 Max.   :55792                                                                              
                                                                                            
  publisher          developer          critic_score     user_score    total_shipped  
 Length:55792       Length:55792       Min.   : 1.00   Min.   : 2.00   Min.   : 0.03  
 Class :character   Class :character   1st Qu.: 6.40   1st Qu.: 7.80   1st Qu.: 0.20  
 Mode  :character   Mode  :character   Median : 7.50   Median : 8.50   Median : 0.59  
                                       Mean   : 7.21   Mean   : 8.25   Mean   : 1.89  
                                       3rd Qu.: 8.30   3rd Qu.: 9.10   3rd Qu.: 1.80  
                                       Max.   :10.00   Max.   :10.00   Max.   :82.86  
                                       NA's   :49256   NA's   :55457   NA's   :53965  
  global_sales      na_sales       pal_sales        jp_sales      other_sales         year     
 Min.   : 0.00   Min.   :0.00    Min.   :0.00    Min.   :0.00    Min.   :0.00    Min.   :1970  
 1st Qu.: 0.03   1st Qu.:0.05    1st Qu.:0.01    1st Qu.:0.02    1st Qu.:0.00    1st Qu.:2000  
 Median : 0.12   Median :0.12    Median :0.04    Median :0.05    Median :0.01    Median :2008  
 Mean   : 0.37   Mean   :0.28    Mean   :0.16    Mean   :0.11    Mean   :0.04    Mean   :2006  
 3rd Qu.: 0.36   3rd Qu.:0.29    3rd Qu.:0.14    3rd Qu.:0.12    3rd Qu.:0.04    3rd Qu.:2011  
 Max.   :20.32   Max.   :9.76    Max.   :9.85    Max.   :2.69    Max.   :3.12    Max.   :2020  
 NA's   :36377   NA's   :42828   NA's   :42603   NA's   :48749   NA's   :40270   NA's   :979   
 last_update        vgchartzscore  
 Length:55792       Min.   :2.60   
 Class :character   1st Qu.:6.80   
 Mode  :character   Median :7.80   
                    Mean   :7.43   
                    3rd Qu.:8.50   
                    Max.   :9.60   
                    NA's   :54993  
sales_2019_terr <- sales_clean_2019 %>% 
  mutate("total_shipped_2019", total_shipped) %>% 
  mutate("global_sales_2019", global_sales) %>% 
  mutate("na_sales_2019", na_sales) %>%
  mutate("eu_sales_2019", pal_sales) %>%
  mutate("jp_sales_2019", jp_sales) %>% 
  mutate("other_sales_2019", other_sales)

sales_2019_terr
sales_clean_2019
sales_2019_conf <- sales_2019_terr %>% 
  select(-global_sales) %>% 
  select(-na_sales) %>% 
  select(-pal_sales) %>% 
  select(-jp_sales) %>% 
  select(-other_sales)

sales_2019_conf
sales_clean_2016
summary(sales_clean_2016)
     name             platform         year_of_release       genre            publisher        
 Length:16719       Length:16719       Length:16719       Length:16719       Length:16719      
 Class :character   Class :character   Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character   Mode  :character  
                                                                                               
                                                                                               
                                                                                               
                                                                                               
    na_sales          eu_sales         jp_sales        other_sales        global_sales    
 Min.   : 0.0000   Min.   : 0.000   Min.   : 0.0000   Min.   : 0.00000   Min.   : 0.0100  
 1st Qu.: 0.0000   1st Qu.: 0.000   1st Qu.: 0.0000   1st Qu.: 0.00000   1st Qu.: 0.0600  
 Median : 0.0800   Median : 0.020   Median : 0.0000   Median : 0.01000   Median : 0.1700  
 Mean   : 0.2633   Mean   : 0.145   Mean   : 0.0776   Mean   : 0.04733   Mean   : 0.5335  
 3rd Qu.: 0.2400   3rd Qu.: 0.110   3rd Qu.: 0.0400   3rd Qu.: 0.03000   3rd Qu.: 0.4700  
 Max.   :41.3600   Max.   :28.960   Max.   :10.2200   Max.   :10.57000   Max.   :82.5300  
                                                                                          
  critic_score    critic_count     user_score          user_count       developer        
 Min.   :13.00   Min.   :  3.00   Length:16719       Min.   :    4.0   Length:16719      
 1st Qu.:60.00   1st Qu.: 12.00   Class :character   1st Qu.:   10.0   Class :character  
 Median :71.00   Median : 21.00   Mode  :character   Median :   24.0   Mode  :character  
 Mean   :68.97   Mean   : 26.36                      Mean   :  162.2                     
 3rd Qu.:79.00   3rd Qu.: 36.00                      3rd Qu.:   81.0                     
 Max.   :98.00   Max.   :113.00                      Max.   :10665.0                     
 NA's   :8582    NA's   :8582                        NA's   :9129                        
    rating         
 Length:16719      
 Class :character  
 Mode  :character  
                   
                   
                   
                   
sales_2016_conf <- sales_clean_2016 %>% 
  select(-year_of_release) %>% 
  select(-critic_count) %>% 
  select(-user_count) %>% 
  select(-rating)

sales_2016_conf
sales_clean_2016_sec <- sales_2016_conf %>%
  select(-user_score)

Do a full join:

still need to get rid of pal_sales and make it eu_sales

sales_full <- full_join(sales_clean_2019_sec, sales_clean_2016_sec)
Joining, by = c("name", "genre", "platform", "publisher", "developer", "critic_score", "global_sales", "na_sales", "jp_sales", "other_sales")
sales_full
sales_2016_user <- sales_2016_conf %>% 
  select(-user_score)
sales_2016_user %>% 
  select(-rating)
sales_2019_conf
view(sales_full)
sales_full %>% 
  filter(global_sales > 0) %>%
  select(total_shipped)
sales_full
mutate_all(sales_full, "global_shipped" = "total_shipped" + "global_sales")
Error in "total_shipped" + "global_sales" : 
  non-numeric argument to binary operator
mutate(sales_full, global_shipped = (total_shipped + global_sales))
mutate(sales_full, "global_shipped", total_shipped + global_sales)
mutate(sales_full, "global_shipped", (total_shipped + global_sales))
sales_full
here()
[1] "/Users/richardmichaelclark/games_data_sales_project/games_data_sales_project"
view(sales_full)
sales_full_longer <- sales_full %>% 
  pivot_longer(cols = c("global_sales", "na_sales", "pal_sales", "jp_sales", "other_sales"),
               names_to = "sales_geo",
               values_to = "sales_m")
write.csv(sales_full_longer, "sales_full_cleaned.csv")
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGphbml0b3IpCmxpYnJhcnkoaGVyZSkKYGBgCgpgYGB7cn0Kc2FsZXNfY2xlYW5fMjAxOQpgYGAKCmBgYHtyfQpoZXJlKCkKYGBgCgoKYGBge3J9CnNhbGVzX2NsZWFuXzIwMTkgJT4lIAogIGdncGxvdChhZXMoeCA9IG5hbWUsIHkgPSB0b3RhbF9zaGlwcGVkKSkgKwogIGdlb21fcG9pbnQoKQoKZ2dzYXZlKCJub2lzZS5wbmciKQpgYGAKCgpgYGB7cn0KaGVyZSgpCmBgYAoKCmBgYHtyfQpzYWxlc18yMDE2IDwtIHJlYWRfY3N2KCJyYXdfZGF0YS9zYWxlcy0yMDE2LXdpdGgtcmF0aW5ncy5jc3YiKQpgYGAKCmBgYHtyfQpzYWxlc18yMDE2CmBgYAoKYGBge3J9Cm5hbWVzKHNhbGVzXzIwMTYpCmBgYAoKSSB3YW50ZWQgdG8gY2hlY2sgYWxsIHRoZSB2YXJpYWJsZSBuYW1lcy4gVGhleSBhcmUgaW4gY2FwaXRhbHMgc28gSSB3YW50IHRvIGxvc2UgdGhlIGNhcGl0YWxzIHNvIEkgd2lsbCB1c2UgdGhlIGNsZWFuX25hbWVzIGZ1bmN0aW9uIGZyb20gamFuaXRvciBwYWNrYWdlOgoKYGBge3J9CnNhbGVzX2NsZWFuXzIwMTYgPC0gY2xlYW5fbmFtZXMoc2FsZXNfMjAxNikKYGBgCgpgYGB7cn0KZ2xpbXBzZShzYWxlc19jbGVhbl8yMDE2KQpgYGAKCk8gd2FudCB0byBjaGVjayBmb3IgbWlzc2luZyB2YXJpYWJsZXMgYW5kIG4vYSBzbyBJIGRvIHRoaXMgdGhyb3VnaCBzdW1tYXJ5IGZ1bmN0aW9uLgoKYGBge3J9CnN1bW1hcnkoc2FsZXNfY2xlYW5fMjAxNikKYGBgCgpUaGluZ3MgSSBub3RlIGZyb20gdGhlIHN1bW1hcnk6Cgp5ZWFyX29mX3JlbGVhc2UgaXMgY2hhcmFjdGVyIGNsYXNzIHdoaWNoIGlzIG9kZC4gSXMgaXQgYSByZWxldmFudCB2YXJpYWJsZSB0byBhbnN3ZXIgdGhlIHF1ZXN0aW9ucz8gSSB0aGluayBmb3IgcGxvdHRpbmcgdGltZSBzZXJpZXMgdGhhdCBpdCBjb3VsZCBiZSBzbyBJIHdvdWxkIHdhbnQgdG8gY2hhbmdlIHRoZSB5ZWFyIHRvIGFuIGludGVnZXIuCgpuYV9zYWxlcyBpcyBOb3J0aCBBbWVyaWNhbiBzYWxlcwpldV9zYWxlcyBpcyBFdXJvcGVhbgpqcF9zYWxlcyBpcyBKYXBhbgpvdGhlcl9zYWxlcyBpcyByZXN0IG9mIHdvcmxkCmdsb2JhbF9zYWxlcyBpcyB0aGUgc3VtIG9mIGFsbCB0aGUgb3RoZXJzCgoKCmBgYHtyfQpzYWxlc19jbGVhbl8yMDE2ICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBuYW1lLCB5ID0gZ2xvYmFsX3NhbGVzKSkgKwogIGdlb21fcG9pbnQoKQpgYGAKClNvIGl0IHdvdWxkIGFwcGVhciB0aGF0IHRoZXJlIGlzIG9uZSBvdXRsaWVyIHRoYXQgZG9uZSBtdWNoIGJldHRlciB0aGFuIHRoZSByZXN0LgpMZXQncyB0cnkgYW5kIGZpbmQgb3V0IHdobyB0aGF0IGlzOgoKYGBge3J9CnNhbGVzX2NsZWFuXzIwMTYgJT4lIAogIGFycmFuZ2UoZGVzYyhnbG9iYWxfc2FsZXMpKQpgYGAKCmBgYHtyfQpib3hwbG90KHNhbGVzX2NsZWFuXzIwMTYkZ2xvYmFsX3NhbGVzKQpgYGAKCmBgYHtyfQpzYWxlc18yMDE5IDwtIHJlYWRfY3N2KCJyYXdfZGF0YS9zYWxlcy0yMDE5LmNzdiIpCmBgYAoKYGBge3J9CnNhbGVzX2NsZWFuXzIwMTkgPC0gY2xlYW5fbmFtZXMoc2FsZXNfMjAxOSkKYGBgCgpgYGB7cn0Kc2FsZXNfY2xlYW5fMjAxOQpgYGAKCgpgYGB7cn0Kc2FsZXNfY2xlYW5fMjAxOSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gbmFtZSwgeSA9IHRvdGFsX3NoaXBwZWQpKSArCiAgZ2VvbV9wb2ludCgpCgpnZ3NhdmUoInNvdW5kX29mX3N1Y2Nlc3MiKQpgYGAKCgpgYGB7cn0Kc2FsZXNfY2xlYW5fMjAxOSAlPiUgCiAgc3VtbWFyeSgpCmBgYAoKCmBgYHtyfQpzYWxlc19jbGVhbl8yMDE5CmBgYAoKYGBge3J9CnZpZXcoc2FsZXNfY2xlYW5fMjAxNikKYGBgCgpgYGB7cn0KdmlldyhzYWxlc19jbGVhbl8yMDE5KQpgYGAKCmBgYHtyfQpib3hwbG90KHNhbGVzX2NsZWFuXzIwMTkkZ2xvYmFsX3NhbGVzKQpgYGAKCmBgYHtyfQpuYW1lcyhzYWxlc19jbGVhbl8yMDE2KQpgYGAKCmBgYHtyfQpuYW1lcyhzYWxlc19jbGVhbl8yMDE5KQpgYGAKCmBgYHtyfQpzYWxlc19jbGVhbl8yMDE2ICU+JSAKICBzZWxlY3QoY3JpdGljX3Njb3JlKSAlPiUgCiAgYXJyYW5nZShkZXNjKGNyaXRpY19zY29yZSkpCmBgYAoKYGBge3J9CnNhbGVzX2NsZWFuXzIwMTkgJT4lIAogIHNlbGVjdChjcml0aWNfc2NvcmUpICU+JSAKICBhcnJhbmdlKGRlc2MoY3JpdGljX3Njb3JlKSkKYGBgCgpgYGB7cn0Kc2FsZXNfY2xlYW5fMjAxNiAlPiUgCiAgZGlzdGluY3QocmF0aW5nKQpgYGAKCmBgYHtyfQpzYWxlc19jbGVhbl8yMDE5ICU+JSAKICBkaXN0aW5jdChlc3JiX3JhdGluZykKYGBgCgpgYGB7cn0Kc2FsZXNfY2xlYW5fMjAxOSAlPiUgCiAgZGlzdGluY3QodmdfY2hhcnR6X3Njb3JlKQpgYGAKCmBgYHtyfQpzYWxlc19jbGVhbl8yMDE5ICU+JSAKICBmaWx0ZXIodG90YWxfc2hpcHBlZCA+IDApICU+JSAKICBjb3VudChnbG9iYWxfc2FsZXMpIApgYGAKCmBgYHtyfQpzYWxlc19jbGVhbl8yMDE5ICU+JSAKICBmaWx0ZXIodG90YWxfc2hpcHBlZCA+IDApICU+JSAKICBjb3VudChuYV9zYWxlcykgCmBgYAoKCmBgYHtyfQpzYWxlc19jbGVhbl8yMDE5ICU+JSAKICBmaWx0ZXIodG90YWxfc2hpcHBlZCA+IDApICU+JSAKICBjb3VudChwYWxfc2FsZXMpIApgYGAKCmBgYHtyfQpzYWxlc19jbGVhbl8yMDE5ICU+JSAKICBmaWx0ZXIodG90YWxfc2hpcHBlZCA+IDApICU+JSAKICBjb3VudChqcF9zYWxlcykgCmBgYAoKYGBge3J9CnNhbGVzX2NsZWFuXzIwMTkgJT4lIAogIGZpbHRlcih0b3RhbF9zaGlwcGVkID4gMCkgJT4lIAogIGNvdW50KG90aGVyX3NhbGVzKQpgYGAKCmBgYHtyfQpzYWxlc19jbGVhbl8yMDE5ICU+JSAKICBmaWx0ZXIoZ2xvYmFsX3NhbGVzID4gMCkgJT4lCiAgc2VsZWN0KGdsb2JhbF9zYWxlcywgbmFfc2FsZXMsIHBhbF9zYWxlcywganBfc2FsZXMsIG90aGVyX3NhbGVzKSAlPiUgCiAgc3VtbWFyeQpgYGAKCmBgYHtyfQo/c3VtCmBgYAoKCmBgYHtyfQpnbG9iYWxfc2FsZXNfdG90IDwtIHNhbGVzX2NsZWFuXzIwMTkgJT4lIAogIGZpbHRlcihnbG9iYWxfc2FsZXMgPiAwKSAlPiUgCiAgc2VsZWN0KGdsb2JhbF9zYWxlcykgJT4lIAogIHN1bSgpCmdsb2JhbF9zYWxlc190b3QKYGBgCgpgYGB7cn0KbmFfc2FsZXNfdG90IDwtIHNhbGVzX2NsZWFuXzIwMTkgJT4lIAogIGZpbHRlcihuYV9zYWxlcyA+IDApICU+JSAKICBzZWxlY3QobmFfc2FsZXMpICU+JSAKICBzdW0oKQpuYV9zYWxlc190b3QKYGBgCgpgYGB7cn0KcGFsX3NhbGVzX3RvdCA8LSBzYWxlc19jbGVhbl8yMDE5ICU+JSAKICBmaWx0ZXIocGFsX3NhbGVzID4gMCkgJT4lIAogIHNlbGVjdChwYWxfc2FsZXMpICU+JSAKICBzdW0oKQpwYWxfc2FsZXNfdG90CmBgYAoKYGBge3J9CmpwX3NhbGVzX3RvdCA8LSBzYWxlc19jbGVhbl8yMDE5ICU+JSAKICBmaWx0ZXIoanBfc2FsZXMgPiAwKSAlPiUgCiAgc2VsZWN0KGpwX3NhbGVzKSAlPiUgCiAgc3VtKCkKanBfc2FsZXNfdG90CmBgYAoKYGBge3J9Cm90aGVyX3NhbGVzX3RvdCA8LSBzYWxlc19jbGVhbl8yMDE5ICU+JSAKICBmaWx0ZXIob3RoZXJfc2FsZXMgPiAwKSAlPiUgCiAgc2VsZWN0KG90aGVyX3NhbGVzKSAlPiUgCiAgc3VtKCkKb3RoZXJfc2FsZXNfdG90CmBgYAoKYGBge3J9Cmdsb2JhbF9zYWxlc190b3QgLSAoanBfc2FsZXNfdG90ICsgbmFfc2FsZXNfdG90ICsgb3RoZXJfc2FsZXNfdG90ICsgcGFsX3NhbGVzX3RvdCkKYGBgCgpgYGB7cn0Kc2FsZXNfY2xlYW5fMjAxOSAlPiUgCiAgZmlsdGVyKGxhc3RfdXBkYXRlID4gMCkgJT4lIAogIGRpc3RpbmN0KGxhc3RfdXBkYXRlKQpgYGAKCmBgYHtyfQpzYWxlc19jbGVhbl8yMDE5ICU+JSAKICBkaXN0aW5jdChzdGF0dXMpCmBgYAoKYGBge3J9CnNhbGVzX2NsZWFuXzIwMTkgJT4lIAogIGZpbHRlcih2Z2NoYXJ0enNjb3JlID4gMCkgJT4lIAogIHNlbGVjdChjcml0aWNfc2NvcmUsIHVzZXJfc2NvcmUsIHZnY2hhcnR6c2NvcmUpCmBgYAoKYGBge3J9CnNhbGVzX2NsZWFuXzIwMTkgJT4lIAogIGZpbHRlcihnbG9iYWxfc2FsZXMgPT0gMCkgJT4lIAogIHNlbGVjdChuYV9zYWxlcywgcGFsX3NhbGVzLCBqcF9zYWxlcywgb3RoZXJfc2FsZXMpCmBgYApgYGB7cn0Kc2FsZXNfY2xlYW5fMjAxOQpgYGAKCgoKCgoKYGBge3J9CgpgYGAKCmBgYHtyfQpzYWxlc19jbGVhbl8yMDE5ICU+JSAKICBkaXN0aW5jdChlc3JiX3JhdGluZykKYGBgCgoKYGBge3J9CiMjc2FsZXNfY2xlYW5fMjAxOSA8LSBzYWxlc19jbGVhbl8yMDE5ICU+JSAKICMgbXV0YXRlKCJlIiwgZXNyYl9yYXRpbmcgPSAia2EiKQpgYGAKCgoKCmBgYHtyfQojc2FsZXNfbWlzcyA8LSBzYWxlc19jbGVhbl8yMDE5ICU+JSAKICBmaWx0ZXIobmFfc2FsZXMgPT0gMCkgJT4lIAogIG11dGF0ZSgibWlzc2luZ19zYWxlcyIsIChnbG9iYWxfc2FsZXMgLSBuYV9zYWxlcyAtIHBhbF9zYWxlcyAtIGpwX3NhbGVzIC0gb3RoZXJfc2FsZXMpKSAlPiUgCgpzYWxlc19taXNzCmBgYAoKCgpOb3cgSSBhbSBnb2luZyB0byBjb25maXJtIHdoaWNoIHZhcmlhYmxlIGhlYWRpbmcgaW4gMjAxNiBpcyB3aGF0IGluIDIwMTk6CgoyMDE2IHZzIDIwMTkKcmFuayBvbmx5IGluIDIwMTkKTmFtZSBpcyBOYW1lIGFuZCBiYXNlbmFtZSBpbiAyMDE5IGxvb2tzIGxpa2UgYSBjbGVhbmVkIHZlcnNpb24gb2YgbmFtZQpQbGF0Zm9ybSBpcyBwbGF0Zm9ybQpZZWFyIG9mIHJlbGVhc2UgaXMgeWVhciB1dCB5ZWFyIG9mIHJlbGVhc2UgaXMgYSBjaGFyYWN0ZXIgYW5kIEkgY2FuJ3Qgd29yayBvdXQgaG93IHRvIHR1cm4gaXQgaW50byBhIG51bWVyIHNvIEkgdGhpbmsgd2Ugc2hvdWxkIGV4Y2x1ZGUgdGhpcyB2YXJpYWJsZQpnZW5yZSBpcyBnZW5yZQpwdWJsaXNoZXIgaXMgcHVibGlzaGVyCm5hLXNhbGVzIGlzIG5hX3NhbGVzCmpwX3NhbGVzIGlzIGpwX3NhbGVzCmV1X3NhbGVzIGlzIHNlcGFyYXRlOyBwYWxfc2FsZXMgaXMgQXNpYSwgQWZyaWNhLCBFdXJvcGUsIFNvdXRoIEFtZXJpY2EgYW5kIE9jZWFuaWEgYWNjb3JkaW5nIHRvIGdvb2dsZSBidXQgYWNjb3JkaW5nIHRvIHRoZSBkYXRhIGRpY3Rpb25hcnkgaXM9dCBpcyBFVSBzYWxlcwpUaGVyZWZvcmUgb3RoZXJfc2FsZXMgaW4gMjAxNiBkb2Vzbid0IG1hdGNoIG90aGVyX3NhbGVzIGluIDIwMTkKZ2xvYmFsX3NhbGVzIGlzIGdsb2JhbF9zYWxlcwpjcml0aWNfc2NvcmUgbnVtYmVycyA4NCB0byAxMDAgaW4gMjAxNgpjcml0aWNfc2NvcmUgbnVtYmVycyA4LjYgdG8gMTAgaW4gMjAxOSAoc28gSSB3aWxsIGRpdmlkZSB0aGF0IGZpZ3VyZSBpbiAyMDE2IGJ5IDEwIHRvIGNvbXBhcmUpCmNyaXRpY19jb3VudCBhbmQgdXNlcl9jb3VudCBhcHBlYXIgdG8gYmUgdGhlIG51bWJlciBvZiBjcml0aWNzIGFuZCB1c2VycyB3aG8gaGF2ZSBiZWVuIGFza2VkIHRvIGRlcml2ZSB0aGUgYXZlcmFnZSByZXZpZXcgc2NvcmUgc28gSSBhbSBnb2luZyB0byBwdWxsIHRoZW0gb3V0IG9mIHRoZSBkYXRhCmRldmVsb3BlciBpcyBkZXZlbG9wZXIKSSBnb29nbGVkIHRoZSBnYW1lcyByYXRpbmcgYW5kIHRoaXMgaXMgcmVmZXJlbmNlIHRvIGFnZSBhcHByb3ByaWF0ZW5lc3M6Cmh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0VudGVydGFpbm1lbnRfU29mdHdhcmVfUmF0aW5nX0JvYXJkCkUgPSBFdmVyeW9uZQpNID0gTWF0dXJlIDE3KwpUID0gVGVlbiAxMysKRTEwKyA9IGV2ZXJ5b25lIHRlbiB5ZWFycyBvbGQgYW5kIG9sZGVyCkstQSA9IEtpZHMgdG8gYWR1bHRzIC0gbGF0ZXIgcmVuYW1lZCBldmVyeW9uZQpBTyA9IGFkdWx0cyBvbmx5IDE4KwpFQyA9IGVhcmx5IGNoaWxkaG9vZApSUCA9IFJhdGluZyBwZW5kaW5nCgpJbiAyMDE5IHRoaXMgaXMgY2FsbGllZCBlc3JiX3JhdGluZyBhbmQgS0EgY2FuIGFsc28gYmUgY2hhbmdlZCB0byBFCgpBbHNvIGluY2x1ZGVkIGluIDIwMTkgZGF0YSBpcyB2Z19jaGFydHpfc2NvcmUgd2hpY2ggaGFzIG5vIHZhcmlhYmxlcyBzbyB0aGF0IGNhbiBleGNsdWRlZCBmcm9tIHRoZSBjbGVhbmVkIGRhdGFzZXQKVG90YWwgc2hpcHBlZCB3aGljaCBhcHBlYXJzIGluc3RlYWQgb2YgZ2xvYmFsIHNhbGVzIGFuZCBoYXMgbm8gb3RoZXIgc3BsaXQKClVuZm9ydHVuYXRlbHkgdGhlcmUgYXJlIG1pc3NpbmcgdmFyaWFibGVzIGZvciBhbGwgZ2VvZ3JhcGhpYyBhcmVhcyBidXQgdGhlIG1hcmdpbiBvZiBkaWZmZXJlbmNlIGlzIDQuNjdtIHNvIEkgYW0gZ29pbmcgdG8gY3JlYXRlIGEgbXV0YXRlIGZ1bmN0aW9uIHRvIGhpZ2hsaWdodCB3aGljaCBvbmVzIGhhdmUgYSBtaXNzaW5nIHZhcmlhYmxlIGFuZCBzZWUgaWYgdGhleSBjYW4gYmUgYWRkZWQgdG9nZXRoZXIKCkxhc3RfdXBkYXRlIGlzIGFuIGludGVyZXN0aW5nIHBpZWNlIG9mIGluZm9ybWF0aW9uIGJlY2F1c2UgaXQgaW5kaWNhdGVzIGFuIHVwZGF0ZSBzaW5jZSB0aGUgbGFzdCBkYXRhc2V0IGFuZCBhbHNvIHRoYXQgdGhlcmUgaXMgc29tZSBsb25nZXZpdHkgdG8gdGhlIG9yaWdpbmFsIHJlbGVhc2UuIEkgYW0gaW5jbGluZWQgdG8ga2VlcCB0aGlzIHZhcmlhYmxlIGV2ZW4gdGhvdWdoIHRoZXJlIGFyZSBzZXZlcmFsIHdpdGggbm8gZmlndXJlLiBUaGUgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQgSSBoYXZlIGEgdGhlb3J5IHRoYXQgdGhlIG9uZXMgd2l0aCB1cGRhdGVzIGFyZSBsaWtlbHkgdG8gYmUgYmlnIHNlbGxlcnMuCgpJIHdpbGwgZXhjbHVkZSB0aGUgdXJsIGNvbHVtbiBiZWNhdXNlIGl0J3Mgbm90IHJlbGV2YW50IGZvciB0aGlzIHBpZWNlIG9mIGFuYWx5c2lzClRoZXJlIGlzIGlubHkgb25lIHN0YXR1cyBvZiAnMScgc28gSSB3aWxsIGJlIHJlbW92aW5nIHRoYXQuCkkgbmVlZCB0byBtYWtlIHRoZSB5ZWFyIGludG8gYSBudW1iZXIgYXMgaW50ZWdlciBvciBudW1lcmljICh3aWxsIGNoZWNrKQpJdCdzIG5vdCBjbGVhciB3aHkgdGhlcmUgd2Fzbid0IHZnY2hhcnR6IHZhcmlhYmxlcyBvbiB0aGUgMjAxNiBkYXRhc2V0IGJlY2F1c2UgaXQgd2FzIGxhdW5jaGVkIHNvbWUgdGltZSBiZWZvcmUgdGhlbi4KaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVkdDaGFydHoKCkkgd2lsbCBleGNsdWRlIHRoZSBpbWcgaXJsIHZhcmlhYmxlLgoKSSBhbSBnb2luZyB0byBtYWtlIHRoZSB5ZWFyIGluIDIwMTYgZGF0YSBhIG51bWJlcjoKCmBgYHtyfQpzYWxlc19jbGVhbl8yMDE2IDwtIHNhbGVzX2NsZWFuXzIwMTYgJT4lIAogIGFzLm51bWVyaWMoInllYXJfb2ZfcmVsZWFzZSIpCmBgYAoKVGhhdCBkb2Vzbid0IHNlZW0gdG8gd29yay4gSXQgZG9lcyBub3cuCgpgYGB7cn0Kc3VtbWFyeShzYWxlc19jbGVhbl8yMDE2KQpgYGAKCgoKCgoKTGV0J3MgbWFrZSBhbGwgdmFyaWFibGVzIGxvd2VyIGNhc2UKYGBge3J9CiNzYWxlc19jbGVhbl8yMDE2IDwtIHNhbGVzX2NsZWFuXzIwMTYgJT4lIAogIyBtdXRhdGVfYWxsKC5mdW5zID0gdG9sb3dlcikKI2hlYWQoc2FsZXNfY2xlYW5fMjAxNikKYGBgCgpgYGB7cn0KI3NhbGVzX2NsZWFuXzIwMTkgPC0gc2FsZXNfY2xlYW5fMjAxOSAlPiUgCiAjIG11dGF0ZV9hbGwoLmZ1bnMgPSB0b2xvd2VyKQojaGVhZChzYWxlc19jbGVhbl8yMDE5KQpgYGAKCkkgd2FudCB0byBmaWxsIGluIG1pc3Npbmcgc2FsZXMgdm9sdW1lcwpJIGFtIGdvaW5nIHRvIGV4Y2x1ZGUgYmFzZW5hbWUgZnJvbSAyMDE5IHJlc3VsdHMKSSBhbSBnb2luZyB0byBjaGFuZ2UgY3JpdGljX3Njb3JlIGluIDIwMTYgdG8gY3JpdGljX3Njb3JlXzIwMTYgYW5kIGRvIHRoZSBzYW1lIGZvciAyMDE5CkkgYW0gZ29pbmcgdG8gY2hhbmdlIHBhbF9zYWxlcyBpbiAyMDE5IHRvIGV1X3NhbGVzXzIwMTkgYW5kIGFkZCB0aGUgeWVhciB0byAKCmBgYHtyfQpzdW1tYXJ5KHNhbGVzX2NsZWFuXzIwMTkpCmBgYAoKCgpgYGB7cn0Kc2FsZXNfY2xlYW5fMjAxOV9zZWMgPC0gc2FsZXNfY2xlYW5fMjAxOSAlPiUgCiAgc2VsZWN0KC1iYXNlbmFtZSkgJT4lIAogIHNlbGVjdCgtdmdfY2hhcnR6X3Njb3JlKSAlPiUgCiAgc2VsZWN0KC11cmwpICU+JSAKICBzZWxlY3QoLXN0YXR1cykgJT4lIAogIHNlbGVjdCgtaW1nX3VybCkKICAKCnN1bW1hcnkoc2FsZXNfY2xlYW5fMjAxOV9zZWMpCmBgYAoKCgpgYGB7cn0KI3NhbGVzXzIwMTlfdGVyciA8LSBzYWxlc19jbGVhbl8yMDE5ICU+JSAKICMgbXV0YXRlKCJ0b3RhbF9zaGlwcGVkXzIwMTkiLCB0b3RhbF9zaGlwcGVkKSAlPiUgCiAgbXV0YXRlKCJnbG9iYWxfc2FsZXNfMjAxOSIsIGdsb2JhbF9zYWxlcykgJT4lIAogIG11dGF0ZSgibmFfc2FsZXNfMjAxOSIsIG5hX3NhbGVzKSAlPiUKICBtdXRhdGUoImV1X3NhbGVzXzIwMTkiLCBwYWxfc2FsZXMpICU+JQogIG11dGF0ZSgianBfc2FsZXNfMjAxOSIsIGpwX3NhbGVzKSAlPiUgCiAgbXV0YXRlKCJvdGhlcl9zYWxlc18yMDE5Iiwgb3RoZXJfc2FsZXMpCgpzYWxlc18yMDE5X3RlcnIKYGBgCgpgYGB7cn0Kc2FsZXNfY2xlYW5fMjAxOQpgYGAKCgpgYGB7cn0KI3NhbGVzXzIwMTlfY29uZiA8LSBzYWxlc19jbGVhbl8yMDE5ICU+JSAKICBzZWxlY3QoLSkKCnNhbGVzXzIwMTlfY29uZgpgYGAKCmBgYHtyfQpzYWxlc19jbGVhbl8yMDE2CmBgYAoKYGBge3J9CnN1bW1hcnkoc2FsZXNfY2xlYW5fMjAxNikKYGBgCgoKYGBge3J9CnNhbGVzXzIwMTZfY29uZiA8LSBzYWxlc19jbGVhbl8yMDE2ICU+JSAKICBzZWxlY3QoLXllYXJfb2ZfcmVsZWFzZSkgJT4lIAogIHNlbGVjdCgtY3JpdGljX2NvdW50KSAlPiUgCiAgc2VsZWN0KC11c2VyX2NvdW50KSAlPiUgCiAgc2VsZWN0KC1yYXRpbmcpCgpzYWxlc18yMDE2X2NvbmYKYGBgCgpgYGB7cn0KCmBgYAoKCmBgYHtyfQpzYWxlc19jbGVhbl8yMDE2X3NlYyA8LSBzYWxlc18yMDE2X2NvbmYgJT4lCiAgc2VsZWN0KC11c2VyX3Njb3JlKQpgYGAKCgoKYGBge3J9CiNzYWxlc18yMDE2X2NvbmYgPC0gc2FsZXNfMjAxNl9jb25mICU+JSAKICBzZWxlY3QoLWFzLm51bWVyaWMoInllYXJfb2ZfcmVsZWFzZSIpKQoKc2FsZXNfMjAxNl9jb25mCmBgYAoKRG8gYSBmdWxsIGpvaW46CgpzdGlsbCBuZWVkIHRvIGdldCByaWQgb2YgcGFsX3NhbGVzIGFuZCBtYWtlIGl0IGV1X3NhbGVzCgpgYGB7cn0Kc2FsZXNfZnVsbCA8LSBmdWxsX2pvaW4oc2FsZXNfY2xlYW5fMjAxOV9zZWMsIHNhbGVzX2NsZWFuXzIwMTZfc2VjKQoKc2FsZXNfZnVsbApgYGAKCmBgYHtyfQojc2FsZXNfMjAxNl91c2VyIDwtIHNhbGVzXzIwMTZfY29uZiAlPiUgCiAgc2VsZWN0KC11c2VyX3Njb3JlKQoKYGBgCgoKCmBgYHtyfQojc2FsZXNfMjAxNl91c2VyICU+JSAKICBzZWxlY3QoLXJhdGluZykKYGBgCgpgYGB7cn0KI3NhbGVzXzIwMTlfY29uZgpgYGAKCmBgYHtyfQp2aWV3KHNhbGVzX2Z1bGwpCmBgYAoKYGBge3J9CnNhbGVzX2Z1bGwgJT4lIAogIGZpbHRlcihnbG9iYWxfc2FsZXMgPiAwKSAlPiUKICBzZWxlY3QodG90YWxfc2hpcHBlZCkKYGBgCgpgYGB7cn0Kc2FsZXNfZnVsbApgYGAKCgpgYGB7cn0KbXV0YXRlX2FsbChzYWxlc19mdWxsLCAiZ2xvYmFsX3NoaXBwZWQiID0gInRvdGFsX3NoaXBwZWQiICsgImdsb2JhbF9zYWxlcyIpCmBgYAoKYGBge3J9Cm11dGF0ZShzYWxlc19mdWxsLCBnbG9iYWxfc2hpcHBlZCA9ICh0b3RhbF9zaGlwcGVkICsgZ2xvYmFsX3NhbGVzKSkKYGBgCgpgYGB7cn0KbXV0YXRlKHNhbGVzX2Z1bGwsICJnbG9iYWxfc2hpcHBlZCIsIHRvdGFsX3NoaXBwZWQgKyBnbG9iYWxfc2FsZXMpCmBgYAoKYGBge3J9Cm11dGF0ZShzYWxlc19mdWxsLCAiZ2xvYmFsX3NoaXBwZWQiLCAodG90YWxfc2hpcHBlZCArIGdsb2JhbF9zYWxlcykpCmBgYAoKYGBge3J9CnNhbGVzX2Z1bGwKYGBgCgpgYGB7cn0KaGVyZSgpCmBgYApgYGB7cn0KdmlldyhzYWxlc19mdWxsKQpgYGAKCgpgYGB7cn0Kc2FsZXNfZnVsbF9sb25nZXIgPC0gc2FsZXNfZnVsbCAlPiUgCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKCJnbG9iYWxfc2FsZXMiLCAibmFfc2FsZXMiLCAicGFsX3NhbGVzIiwgImpwX3NhbGVzIiwgIm90aGVyX3NhbGVzIiksCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInNhbGVzX2dlbyIsCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJzYWxlc19tIikKYGBgCgoKYGBge3J9CndyaXRlLmNzdihzYWxlc19mdWxsX2xvbmdlciwgInNhbGVzX2Z1bGxfY2xlYW5lZC5jc3YiKQpgYGAKCgoKCgoKCgoKCgo=